home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power Programmierung
/
Power-Programmierung (Tewi)(1994).iso
/
assemblr
/
library
/
sampler0
/
comdebug.asm
< prev
next >
Wrap
Assembly Source File
|
1987-01-28
|
22KB
|
1,217 lines
title COMDEBUG.ASM
page 55, 132
COMMENT!
Written by Peter Shier at TADIRAN Givat Shmuel January 1987
This program is a RAM resident serial communications status monitor. It is
installed by typing
COMDEBUG
at the dos prompt. To activate press ALT + Scroll Lock. The state of modem
status, line status and modem control registers is displayed. The DTR line is
highlighted in reverse video and this is considered to be the "cursor"
position. The following keys are now active:
1/0 Raise/lower the line highlighted by the cursor
D Display registers
Left/right arrows Move cursor between DTR and RTS
C Change com port no.
Esc Exit
Com ports 1 to 10 are supported. COM1 and COM2 are at their usual addresses.
(i.e. COM1 at 3F8H and COM2 at 2F8H). COM3 - COM10 start at BASE_ADDRESS and
have a distance between them of PORT_DISPLACEMENT.
!
push_all macro
push ax
push bx
push cx
push dx
push di
push si
push bp
push ds
push es
pushf
endm
pop_all macro
popf
pop es
pop ds
pop bp
pop si
pop di
pop dx
pop cx
pop bx
pop ax
endm
TRUE equ 1
FALSE equ 0
ESC equ 1
D equ 32
C equ 46
ONE equ 2
NUM_ONE equ 79
ZERO equ 11
NUM_ZERO equ 82
LEFT equ 75
RIGHT equ 77
ALT_SHIFT equ 08h
SCROLL_SHIFT equ 10h
KB_DATA equ 60h
KB_CTL equ 61h
ON equ 1
OFF equ 0
REV_VIDEO EQU 70H ; video attributes for display routines
NORM_VIDEO EQU 07H
BOLD EQU 0FH
BOLD_UNDERL EQU 09H
BLINK EQU 87H
;-------------------------- for special adapter cards to add COM ports
BASE_ADDRESS equ 280h ; base address of card i.e. COM3
PORT_DISPLACEMENT equ 8 ; offset from COMn to COMn + 1 for card
MCONT equ 4
LSTAT equ 5
MSTAT equ 6
;--------------------- modem status
D_CTS equ 01h
D_DSR equ 02h
TERI equ 04h
D_RLSD equ 08h
CTS equ 10h
DSR equ 20h
RI equ 40h
RLSD equ 80h
;-------------------- line status
DATA_READY equ 01h
OVERRUN equ 02h
PARITY equ 04h
FRAMING equ 08h
BREAK equ 10h
THRE equ 20h
TSRE equ 40h
;-------------------- modem control
DTR equ 01h
RTS equ 02h
code segment
assume cs:code, ds:code, es:code, ss:code
org 100h
first:
jmp loader
;jmp tester
ASCII_signature db "COMDEBUG by Peter Shier at TADIRAN Givat Shmuel 01/87"
busy db FALSE
old_int9_off dw 0
old_int9_seg dw 0
graphics db FALSE
video_ram dw 0 ; video ram segment
crt_status_port dw 0
crt_control_port dw 0
start_offset dw 0 ; beginning offset in screen seg. for PRINTAT
str_ptr dw 0 ; pointer to ASCIIZ string to print
row db 0 ; row, col to print at
col db 0
attribute db 0 ; desired attribute
screen_storage db 4000 dup(?) ;temp storage for screen contents
modem_control dw 03fch
line_status dw 03fdh
modem_status dw 03feh
port db '01', 0
cursor db DTR
bit db ?, 0
saved_cursor_pos dw ?
main_frame_msg db " C O M D E B U G ", 0
main_frame_1 db "╔════════════════════════════════════════════════════════════════════╗", 0
main_frame_2 db "║ ║", 0
main_frame_3 db "╚════════════════════════════════════════════════════════════════════╝", 0
mod_stat_msg_1 db " Modem Status ", 0
mod_stat_msg_2 db "Delta CTS Delta DSR TERI Delta RLSD CTS DSR RI RLSD", 0
mod_stat_frame_1 db "┌──────────────────────────────────────────────────────────┐", 0
mod_stat_frame_2 db "│ │", 0
mod_stat_frame_3 db "└──────────────────────────────────────────────────────────┘", 0
lin_stat_msg_1 db " Line Status ", 0
lin_stat_msg_2 db "Data Ready Overrun Parity Framing Break THRE TSRE", 0
lin_stat_frame_1 db "┌────────────────────────────────────────────────────────┐", 0
lin_stat_frame_2 db "│ │", 0
lin_stat_frame_3 db "└────────────────────────────────────────────────────────┘", 0
mod_ctrl_msg_1 db "Mod Ctrl", 0
mod_Ctrl_msg_2 db "DTR RTS", 0
mod_ctrl_frame_1 db "┌────────┐", 0
mod_ctrl_frame_2 db "│ │", 0
mod_ctrl_frame_3 db "└────────┘", 0
instruct_msg_1 db "<- -> Move cursor", 0
instruct_msg_2 db "D Display registers", 0
instruct_msg_3 db "1/0 Raise/lower DTR/RTS", 0
instruct_msg_4 db "C Change com port", 0
instruct_msg_5 db "Esc Exit", 0
instruct_msg_6 db "Com port = ", 0
tester proc near
call get_video_mode
call display_screen
t_10:
mov ah, 0
int 16h
cmp al, 1bh
jne t_15
ret
t_15:
xchg al, ah
call com_debug
jmp t_10
tester endp
new_int9:
sti
push_all
push cs
pop ds
cmp busy, TRUE
je now_busy
pushf
call dword ptr old_int9_off
mov ax, 40h
mov es, ax
test byte ptr es:[17h], ALT_SHIFT
jz done
test byte ptr es:[18h], SCROLL_SHIFT
jz done
mov busy, TRUE
mov al, ALT_SHIFT
not al
and byte ptr es:[17h], al
mov al, SCROLL_SHIFT
not al
and byte ptr es:[18h], al
call save_screen
call save_cursor
done:
pop_all
iret
now_busy:
call get_scan_code ; returns scan code in al
cmp al, 80h
jae eoi
cmp al, ESC
jne still_on
call restore_screen
call restore_cursor
mov busy, FALSE
jmp eoi
still_on:
call com_debug ; recieves scan code in al
eoi:
mov al, 20h
out 20h, al
pop_all
iret
get_scan_code proc near
in al, KB_DATA
push ax
in al, KB_CTL
mov ah, al
or al, 80h
out KB_CTL, al
xchg ah, al
out KB_CTL, al
pop ax
ret
get_scan_code endp
save_cursor proc near
mov ah, 03h
mov bh, 00h
int 10h
mov saved_cursor_pos, dx
mov ah, 02h
mov bh, 00h
mov dh, 25
mov dl, 0
int 10h
ret
save_cursor endp
restore_cursor proc near
mov ah, 02h
mov bh, 00h
mov dx, saved_cursor_pos
int 10h
ret
restore_cursor endp
com_debug proc near
; recieves scan code in al
cmp al, D
jne cd_10
call display_modem_status
call display_line_status
call display_modem_control
ret
cd_10:
cmp al, C
jne cd_20
call change_port
call display_port
call display_modem_status
call display_line_status
call display_modem_control
ret
cd_20:
cmp al, ONE
je cd_30
cmp al, NUM_ONE
jne cd_40
cd_30:
mov ah, cursor
mov bh, ON
call set_modem_control
call display_modem_control
ret
cd_40:
cmp al, ZERO
je cd_50
cmp al, NUM_ZERO
jne cd_60
cd_50:
mov ah, cursor
mov bh, OFF
call set_modem_control
call display_modem_control
ret
cd_60:
cmp al, LEFT
je cd_70
cmp al, RIGHT
jne cd_100
cd_70:
cmp cursor, DTR
jne cd_80
mov cursor, RTS
jmp cd_90
cd_80:
mov cursor, DTR
cd_90:
call display_modem_control
ret
cd_100:
mov ah, 0eh
mov al, 07h
int 10h
ret
com_debug endp
change_port proc near
; 'C' was pressed - must change all register addresses to those of next port
cmp port + 1, '1' ; was port 1?
jne cp_10 ; no - check for 10
mov modem_control, 02fch ; yes - set addresses for COM2
mov line_status, 02fdh
mov modem_status, 02feh
inc port + 1 ; set display digit
ret ; and done
cp_10:
cmp port, '1' ; was port 10?
jne cp_20 ; no - check for 2
mov port + 1, '1' ; yes - set up for COM1
mov port, '0'
mov modem_control, 03fch
mov line_status, 03fdh
mov modem_status, 03feh
ret
cp_20:
cmp port + 1, '2' ; was port 2?
jne cp_30 ; no - must be 3 - 10
inc port + 1 ; yes - set up for COM3
mov modem_control, BASE_ADDRESS + MCONT
mov line_status, BASE_ADDRESS + LSTAT
mov modem_status, BASE_ADDRESS + MSTAT
ret
cp_30:
inc port + 1 ; port was 3 - 10
cmp port + 1, 3ah ; is this 10?
jne cp_40 ; no - set addresses
mov port, '1' ; yes - fix up display
mov port + 1, '0'
cp_40:
add modem_control, PORT_DISPLACEMENT ; just increment present
add line_status, PORT_DISPLACEMENT ; values
add modem_status, PORT_DISPLACEMENT
ret
change_port endp
display_screen proc near
mov str_ptr, offset main_frame_1
mov row, 2
mov col, 5
mov attribute, BOLD
call printat
mov cx, 19
mov row, 3
main_loop:
push cx
mov str_ptr, offset main_frame_2
mov col, 5
mov attribute, BOLD
call printat
pop cx
inc row
loop main_loop
mov str_ptr, offset main_frame_3
mov row, 21
mov col, 5
mov attribute, BOLD
call printat
mov str_ptr, offset main_frame_msg
mov row, 2
mov col, 30
mov attribute, REV_VIDEO
call printat
mov str_ptr, offset mod_stat_frame_1
mov row, 4
mov col, 9
mov attribute, BOLD
call printat
mov cx, 3
mov row, 5
mod_stat_loop:
push cx
mov str_ptr, offset mod_stat_frame_2
mov col, 9
mov attribute, BOLD
call printat
pop cx
inc row
loop mod_stat_loop
mov str_ptr, offset mod_stat_frame_3
mov row, 8
mov col, 9
mov attribute, BOLD
call printat
mov row, 4
mov col, 31
mov str_ptr, offset mod_stat_msg_1
mov attribute, REV_VIDEO
call printat
mov row, 6
mov col, 10
mov str_ptr, offset mod_stat_msg_2
mov attribute, BOLD
call printat
mov str_ptr, offset lin_stat_frame_1
mov row, 9
mov col, 10
mov attribute, BOLD
call printat
mov cx, 3
mov row, 10
lin_stat_loop:
push cx
mov str_ptr, offset lin_stat_frame_2
mov col, 10
mov attribute, BOLD
call printat
pop cx
inc row
loop lin_stat_loop
mov str_ptr, offset lin_stat_frame_3
mov row, 13
mov col, 10
mov attribute, BOLD
call printat
mov row, 9
mov col, 31
mov str_ptr, offset lin_stat_msg_1
mov attribute, REV_VIDEO
call printat
mov row, 11
mov col, 11
mov str_ptr, offset lin_stat_msg_2
mov attribute, BOLD
call printat
mov str_ptr, offset mod_ctrl_frame_1
mov row, 15
mov col, 10
mov attribute, BOLD
call printat
mov cx, 3
mov row, 16
mod_ctrl_loop:
push cx
mov str_ptr, offset mod_ctrl_frame_2
mov col, 10
mov attribute, BOLD
call printat
pop cx
inc row
loop mod_ctrl_loop
mov str_ptr, offset mod_ctrl_frame_3
mov row, 19
mov col, 10
mov attribute, BOLD
call printat
mov row, 15
mov col, 11
mov str_ptr, offset mod_ctrl_msg_1
mov attribute, REV_VIDEO
call printat
mov row, 17
mov col, 11
mov str_ptr, offset mod_ctrl_msg_2
mov attribute, BOLD
call printat
mov row, 16
mov col, 28
mov str_ptr, offset instruct_msg_1
mov attribute, BOLD
call printat
mov row, 17
mov col, 32
mov str_ptr, offset instruct_msg_2
mov attribute, BOLD
call printat
mov row, 18
mov col, 30
mov str_ptr, offset instruct_msg_3
mov attribute, BOLD
call printat
mov row, 19
mov col, 32
mov str_ptr, offset instruct_msg_4
mov attribute, BOLD
call printat
mov row, 20
mov col, 30
mov str_ptr, offset instruct_msg_5
mov attribute, BOLD
call printat
mov row, 16
mov col, 59
mov str_ptr, offset instruct_msg_6
mov attribute, BOLD
call printat
call display_port
call display_modem_status
call display_line_status
call display_modem_control
ret
display_screen endp
display_modem_status proc near
mov dx, modem_status
in al, dx
test al, D_CTS
jz dms_10
mov bit, '1'
jmp dms_20
dms_10:
mov bit, '0'
dms_20:
mov row, 7
mov col, 14
mov attribute, NORM_VIDEO
mov str_ptr, offset bit
push ax
call printat
pop ax
test al, D_DSR
jz dms_30
mov bit, '1'
jmp dms_40
dms_30:
mov bit, '0'
dms_40:
mov row, 7
mov col, 26
mov attribute, NORM_VIDEO
mov str_ptr, offset bit
push ax
call printat
pop ax
test al, TERI
jz dms_50
mov bit, '1'
jmp dms_60
dms_50:
mov bit, '0'
dms_60:
mov row, 7
mov col, 33
mov attribute, NORM_VIDEO
mov str_ptr, offset bit
push ax
call printat
pop ax
test al, D_RLSD
jz dms_70
mov bit, '1'
jmp dms_80
dms_70:
mov bit, '0'
dms_80:
mov row, 7
mov col, 42
mov attribute, NORM_VIDEO
mov str_ptr, offset bit
push ax
call printat
pop ax
test al, CTS
jz dms_90
mov bit, '1'
jmp dms_100
dms_90:
mov bit, '0'
dms_100:
mov row, 7
mov col, 51
mov attribute, NORM_VIDEO
mov str_ptr, offset bit
push ax
call printat
pop ax
test al, DSR
jz dms_110
mov bit, '1'
jmp dms_120
dms_110:
mov bit, '0'
dms_120:
mov row, 7
mov col, 56
mov attribute, NORM_VIDEO
mov str_ptr, offset bit
push ax
call printat
pop ax
test al, RI
jz dms_130
mov bit, '1'
jmp dms_140
dms_130:
mov bit, '0'
dms_140:
mov row, 7
mov col, 60
mov attribute, NORM_VIDEO
mov str_ptr, offset bit
push ax
call printat
pop ax
test al, RLSD
jz dms_150
mov bit, '1'
jmp dms_160
dms_150:
mov bit, '0'
dms_160:
mov row, 7
mov col, 65
mov attribute, NORM_VIDEO
mov str_ptr, offset bit
call printat
ret
display_modem_status endp
display_modem_control proc near
mov dx, modem_control
in al, dx
test al, DTR
jz dmc_10
mov bit, '1'
jmp dmc_20
dmc_10:
mov bit, '0'
dmc_20:
cmp cursor, DTR
jne dmc_30
mov attribute, REV_VIDEO
jmp dmc_40
dmc_30:
mov attribute, NORM_VIDEO
dmc_40:
mov row, 18
mov col, 12
mov str_ptr, offset bit
push ax
call printat
pop ax
test al, RTS
jz dmc_50
mov bit, '1'
jmp dmc_60
dmc_50:
mov bit, '0'
dmc_60:
cmp cursor, RTS
jne dmc_70
mov attribute, REV_VIDEO
jmp dmc_80
dmc_70:
mov attribute, NORM_VIDEO
dmc_80:
mov row, 18
mov col, 17
mov str_ptr, offset bit
call printat
ret
display_modem_control endp
set_modem_control proc near
; recieves mask in ah, change flag in bh
mov dx, modem_control
in al, dx
cmp bh, ON
jne smc_10
or al, ah
jmp smc_20
smc_10:
not ah
and al, ah
smc_20:
out dx, al
ret
set_modem_control endp
display_line_status proc near
mov dx, line_status
in al, dx
test al, DATA_READY
jz dls_10
mov bit, '1'
jmp dls_20
dls_10:
mov bit, '0'
dls_20:
mov row, 12
mov col, 15
mov attribute, NORM_VIDEO
mov str_ptr, offset bit
push ax
call printat
pop ax
test al, OVERRUN
jz dls_30
mov bit, '1'
jmp dls_40
dls_30:
mov bit, '0'
dls_40:
mov row, 12
mov col, 26
mov attribute, NORM_VIDEO
mov str_ptr, offset bit
push ax
call printat
pop ax
test al, PARITY
jz dls_50
mov bit, '1'
jmp dls_60
dls_50:
mov bit, '0'
dls_60:
mov row, 12
mov col, 34
mov attribute, NORM_VIDEO
mov str_ptr, offset bit
push ax
call printat
pop ax
test al, FRAMING
jz dls_70
mov bit, '1'
jmp dls_80
dls_70:
mov bit, '0'
dls_80:
mov row, 12
mov col, 43
mov attribute, NORM_VIDEO
mov str_ptr, offset bit
push ax
call printat
pop ax
test al, BREAK
jz dls_90
mov bit, '1'
jmp dls_100
dls_90:
mov bit, '0'
dls_100:
mov row, 12
mov col, 51
mov attribute, NORM_VIDEO
mov str_ptr, offset bit
push ax
call printat
pop ax
test al, THRE
jz dls_110
mov bit, '1'
jmp dls_120
dls_110:
mov bit, '0'
dls_120:
mov row, 12
mov col, 57
mov attribute, NORM_VIDEO
mov str_ptr, offset bit
push ax
call printat
pop ax
test al, TSRE
jz dls_130
mov bit, '1'
jmp dls_140
dls_130:
mov bit, '0'
dls_140:
mov row, 12
mov col, 63
mov attribute, NORM_VIDEO
mov str_ptr, offset bit
call printat
ret
display_line_status endp
display_port proc near
mov row, 16
mov col, 70
mov str_ptr, offset port
mov attribute, BOLD
call printat
ret
display_port endp
save_screen proc near
;----------------------------------------------------------------------------
; this procedure stores the entire contents of the video ram buffer to a safe
; place
;----------------------------------------------------------------------------
mov dx, crt_control_port
cld
push ds
push ds
pop es
mov di, offset screen_storage
mov ax, video_ram
mov ds, ax
;cmp ax, 0b800h
;jne save_10
push es
mov ax, 40h
mov es, ax
mov al, es:[65h]
mov bh, al
and al, 0f7h
out dx, al
pop es
save_10:
mov si, 0
mov cx, 2000
rep movsw
pop ds
;cmp video_ram, 0b800h
;jne save_20
mov al, bh
push ax
push dx
call display_screen
pop dx
pop ax
out dx, al
save_20:
ret
save_screen endp
restore_screen proc near
;----------------------------------------------------------------------------
; procedure to restore original contents of video ram
;----------------------------------------------------------------------------
cld
push ds
pop es
mov si, offset screen_storage
mov ax, video_ram
mov es, ax
cmp ax, 0b800h
jne res_10
push es
mov dx, crt_control_port
mov ax, 40h
mov es, ax
mov al, es:[65h]
mov bh, al
and al, 0f7h
out dx, al
pop es
res_10:
mov di, 0
mov cx, 2000
rep movsw
cmp video_ram, 0b800h
jne res_20
mov al, bh
out dx, al
res_20:
ret
restore_screen endp
printat proc near
;----------------------------------------------------------------------------
; procedure to write an asciiz string to video ram. printat gets its
; parameters from the following variables:
;
; str_ptr dw pointer to asciiz string to display
; row db row to display at (0 - 24)
; col db column to display at (0 - 79)
; attribute db attribute to display with
;
; The caller need only fill these variables and then call printat. A variable
; video_ram dw ? must also be present and contain the segment of the video ram.
;----------------------------------------------------------------------------
xor ax, ax
mov al, row ; calculate relative
mov cl, 80 ; offset of starting position
mul cl ; from start of video ram
xor bh, bh
mov bl, col
add ax, bx
shl ax, 1 ; offset = ((row x 80) + col) * 2
mov di, ax ; di will index video ram
mov bx, video_ram ; initialize es to video ram
mov es, bx
mov ah, attribute ; ah = attribute
mov bx, str_ptr ; bx = pointer to string
mov si, 00 ; si will index string
mov dx, crt_status_port
printat_10:
cmp byte ptr ds:[bx + si], 0 ; is this null byte?
je printat_20 ; yes - all done
mov cl, byte ptr ds:[bx + si] ; no - enter byte
wait_1:
in al, dx
test al, 1
jnz wait_1
cli
wait_2:
in al, dx
test al, 1
jz wait_2
mov es:[di], cl
sti
inc di ; once for character byte
wait_3:
in al, dx
test al, 1
jnz wait_3
cli
wait_4:
in al, dx
test al, 1
jz wait_4
mov es:[di], ah ; enter attribute byte
sti
inc di ; once for attribute byte
inc si ; ++string
jmp printat_10
printat_20:
ret ; all done
printat endp
loader proc near
call get_video_mode
mov ah, 35h
mov al, 09h
int 21h
mov old_int9_off, bx
mov old_int9_seg, es
mov ah, 25h
mov al, 09h
mov dx, offset new_int9
int 21h
mov dx, offset sign_on_msg
mov ah, 09h
int 21h
mov dx, offset loader
int 27h
ret
loader endp
get_video_mode proc near
mov ax, 40h
mov es, ax
mov ax, es:[63h]
add ax, 4
mov crt_control_port, ax
add ax, 2
mov crt_status_port, ax
mov video_ram, 0b000h
mov ah, 15 ; check if graphics display
int 10h
test al, 4
jnz got_mode
mov video_ram, 0b800h ; if so then adjust video ram address
mov graphics, true
got_mode:
ret
get_video_mode endp
sign_on_msg db 0dh, 0ah
db "COMDEBUG now resident - Alt + Scroll Lock to activate"
db 0dh, 0ah, '$'
code ends
end first